package com.chenjt.netty.eight_nio.fileChannel;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;

/**
 * 注释：文件通道
 *
 * @author chenjt
 * @date 2024/8/21 9:17
 */
public class FileChannel {


    public static void main(String[] args) throws Exception {

        // 将input.txt的内容写入output.txt
        FileInputStream inputStream = new FileInputStream("src/main/java/com/chenjt/netty/eight_nio/fileChannel/fileChannel.txt");
        FileOutputStream outputStream = new FileOutputStream("src/main/java/com/chenjt/netty/eight_nio/fileChannel/fileChannel.txt");

        java.nio.channels.FileChannel inputChannel = inputStream.getChannel();
        java.nio.channels.FileChannel outputChannel = outputStream.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(512);

        while(true){

            /**
             * buffer.clear()这里将position的位置置为0，limit移到position原来的位置
             * 如果这里（buffer.clear()）注释掉了
             * 第一次进来时
             *  1.inputChannel.read(buffer);一次读取512个长度，这里会读取512个文件内容的长度，之后再读是往后读取，不会重复读取之前的内容
             *  2.buffer.flip(); position置为0，limit指向position最后指向的位置
             *  3.outputChannel.write(buffer); position指向了limit这个位置上
             * 第二次进来时
             *  1.inputChannel.read(buffer);一次读取512个长度，内容之前都读完了，这里会=0，读取不到内容了，position和limit在同个位置上，没办法再往后移了
             *  2.buffer.flip(); position置为0，limit指向position最后指向的位置
             *  3.outputChannel.write(buffer);会将position指向的之后存储的内容都写入到buffer中
             *
             *  buffer.clear()不注释掉
             * 第一次进来时(和上面的一样)
             * 第二次进来时
             *  1.buffer.clear(); position移动到0，limit移到position原来的位置
             *  2.inputChannel.read(buffer);读取后续的文件内容，已经读取不到内容了，=-1，break
             *
             */
            buffer.clear();

            /**
             * position的指向，指向的前面全都是数据内容，
             * 当position=limit时，这时候再read，已经没有内容了，read出来的结果是0
             */
            int read = inputChannel.read(buffer);

            System.out.println("read:" + read);

            if(-1 == read){
                break;
            }

            buffer.flip();
            outputChannel.write(buffer);
        }

        inputChannel.close();
        outputChannel.close();


    }

}
